/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.dp1.pucp.Ventas.Controlador;

import CharliesCookies.MainController;
import com.dp1.pucp.Modelo.Clases.Documentoventa;
import com.dp1.pucp.Modelo.Clases.Kardex;
import com.dp1.pucp.Modelo.Clases.Lineapedidoproducto;
import com.dp1.pucp.Modelo.Clases.Pedidoproducto;
import com.dp1.pucp.Modelo.Clases.Presentacion;
import com.dp1.pucp.Modelo.Clases.Productofinal;
import com.dp1.pucp.Modelo.Clases.Tipoproducto;
import com.dp1.pucp.Seguridad.DAO.LogDAO;
import com.dp1.pucp.Util.Validaciones;
import com.dp1.pucp.Ventas.DAO.DocVentaDAO;
import com.dp1.pucp.Ventas.DAO.PedidoProdDAO;
import com.dp1.pucp.Ventas.VIsta.MantPedidoProdGUI2;
import com.dp1.pucp.Ventas.VIsta.PedidoProdGUI;
import com.dp1.pucp.Ventas.VIsta.PedidoProdPoliticaGUI;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Date;
import javax.swing.JOptionPane;

/**
 *
 * @author Lucia
 */
public class MantPedidoProdControlador {

    private PedidoProdDAO dao;
    private MantPedidoProdGUI2 mantPedidoProdGUI;
    private ArrayList<String> listaEstado;
    private ArrayList<Pedidoproducto> listaPedidosProd;

    public MantPedidoProdControlador(PedidoProdDAO dao, MantPedidoProdGUI2 view) {
        this.dao = dao;
        this.mantPedidoProdGUI = view;

        this.mantPedidoProdGUI.addNuevoListener(new crearPedidoProdListener());
        this.mantPedidoProdGUI.addBuscarListener(new buscarPedidoProdListener());
        this.mantPedidoProdGUI.addEditarListener(new editarPedidoProdListener());
        this.mantPedidoProdGUI.addEliminarListener(new eliminarPedidoProdListener());
        // this.mantPedidoProdGUI.addPorPoliticaListener(new porPoliticaListener());
        this.mantPedidoProdGUI.addEntregarListener(new entregarListener());
        this.llenarEstadoCombo();

    }

    class crearPedidoProdListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            PedidoProdGUI p = new PedidoProdGUI(mantPedidoProdGUI.getPadre(), true);
            PedidoProdControlador c = new PedidoProdControlador(dao, p, null);
            LogDAO.insertarLog(MainController.usuario, "Ingresar Agregar Pedido de Producto");
            
            p.setVisible(true);
        }
    }

    class buscarPedidoProdListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            int estado = mantPedidoProdGUI.getEstado();
            int codigo = mantPedidoProdGUI.getCodigo();
            String cliente = mantPedidoProdGUI.getCliente();
            cliente = cliente.toUpperCase();


            ArrayList<Pedidoproducto> auxiliar = dao.listarPedidoProd(estado, codigo);

            listaPedidosProd = new ArrayList<>();

            for (int i = 0; i < auxiliar.size(); i++) {
                if (auxiliar.get(i).getCliente().getRazonsocial().toUpperCase().contains(cliente)) {
                    listaPedidosProd.add(auxiliar.get(i));
                }
            }
            mantPedidoProdGUI.llenaGrilla(listaPedidosProd);
        }
    }

    public void llenarEstadoCombo() {
        listaEstado = dao.listarEstado();
        mantPedidoProdGUI.llenaComboEstado(listaEstado);

    }

    class editarPedidoProdListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            int indice = mantPedidoProdGUI.getFilaSel();
            if (indice != -1) {
                PedidoProdGUI pedidoProdGUI = new PedidoProdGUI(mantPedidoProdGUI.getPadre(), true);
                Pedidoproducto pedidoprod = listaPedidosProd.get(indice);
                PedidoProdControlador c = new PedidoProdControlador(dao, pedidoProdGUI, pedidoprod);
                LogDAO.insertarLog(MainController.usuario, "Ingresar Editar Pedido de Producto");
            
                pedidoProdGUI.setVisible(true);
            }
        }
    }

    class eliminarPedidoProdListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            String[] lista = {"Sí", "No"};
            int sel = mantPedidoProdGUI.getFilaSel();
            if (sel != 1) {
                Pedidoproducto pedidoproducto = new Pedidoproducto();
                pedidoproducto = listaPedidosProd.get(sel);
                if (pedidoproducto.getEstado() == 1) {
                    if (JOptionPane.showOptionDialog(mantPedidoProdGUI, "¿Desea cancelar este pedido de productos?",
                            "Cancelar Pedido de Producto", JOptionPane.YES_NO_OPTION, 0, null, lista, lista[1]) == 0) {

                        pedidoproducto.setEstado(0);
                        dao.guardarPedidoProd(pedidoproducto);
                        LogDAO.insertarLog(MainController.usuario, "Eliminar Pedido de Producto");
            
                        JOptionPane.showMessageDialog(mantPedidoProdGUI, "Se canceló el pedido de producto");
                        listaPedidosProd = dao.listarPedidoProdEstado(0);
                        mantPedidoProdGUI.llenaGrilla(listaPedidosProd);

                    }
                } else {
                    Validaciones.mostrarMensajeAvisoVal("No se puede cancelar el Pedido de Producto");
                }
            } else {
                Validaciones.mostrarMensajeAvisoVal("Debe seleccionar un Pedido de Producto.");
            }
        }
    }

//    class porPoliticaListener implements ActionListener {
//
//        @Override
//        public void actionPerformed(ActionEvent e) {
//
//            PedidoProdPoliticaGUI vista = new PedidoProdPoliticaGUI(mantPedidoProdGUI.getPadre(), true);
//            PedidoProdPoliticaControlador c = new PedidoProdPoliticaControlador(dao, vista, null);
//            vista.setVisible(true);
//        }
//    }
    class entregarListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {

            boolean hay = false;
            int sel = 0;
            sel = mantPedidoProdGUI.getFilaSel();

            if (sel == -1) {
                Validaciones.mostrarMensajeErrorVal("Debe seleccionar un pedido de producto.");
                return;
            } else {
                Pedidoproducto p = listaPedidosProd.get(sel);
                // verificar si ha sido cancelada
                ArrayList<Documentoventa> documentosventa = dao.listarDocVentas(0, 0);
                if (documentosventa.size() == 0) {
                    Validaciones.mostrarMensajeAvisoVal("El pedido de producto aún no tiene un documento de venta asociado");
                    return;
                }

                for (int i = 0; i < documentosventa.size(); i++) {
                    if (documentosventa.get(i).getPedidoproducto().getIdpedidoproducto() == p.getIdpedidoproducto()) { //El pedido tiene un docdeventa
                        hay = true;
                        if (documentosventa.get(i).getEstado() == 2) { //El pedido ha sido cancelado
                            if (p.getEstado() == 1) {
                                DocVentaDAO daodao = new DocVentaDAO();
                                Documentoventa d = documentosventa.get(i);
                                disminuirstock(d);
                                daodao.guardarDocVenta(d);
                            } else {
                                if (p.getEstado() == 0) {
                                    Validaciones.mostrarMensajeAvisoVal("El pedido esta cancelado por lo que no puede entregarse los productos.");
                                    return;
                                } else {
                                    Validaciones.mostrarMensajeAvisoVal("El pedido ya fue entregado al cliente anteriormente");
                                    return;
                                }
                            }
                        } else {
                            Validaciones.mostrarMensajeAvisoVal("El pedido de producto aun no ha sido cancelado por el cliente.");
                            return;
                        }
                    } //fin del if



                } // fin del foru
                if (!hay) {
                    Validaciones.mostrarMensajeErrorVal("El pedido aun no tiene un documento de venta asociado.");
                    return;
                }

            }//debe seleccionar un producto
        }
    }

    public void disminuirstock(Documentoventa d) {
        float stockactual, stocksaliente, stockfinal = 0f;
        int galletasxPresentacion = 0;
        int cantidadPresentaciones = 0;
        String mensaje = "Se entregaron los siguientes productos: ";


        Productofinal prodFinal;
        Presentacion presentacion;
        Tipoproducto tipoProducto;
        int cantidadxPresentacion;

        DocVentaDAO daodao = new DocVentaDAO();
        Pedidoproducto p = daodao.getPedidoProducto(d.getPedidoproducto().getIdpedidoproducto());
        ArrayList<Lineapedidoproducto> productos = daodao.listarLineasPedidosProd(p);

        boolean sepuede = true;
        // verificar que hay stock para entregar
        for (int i = 0; i < productos.size(); i++) {
            //disminuye stock del producto

            tipoProducto = dao.getTipoProducto(productos.get(i).getTipoproducto().getIdtipoproducto());
            presentacion = dao.getPresentacion(productos.get(i).getPresentacion().getIdpresentacion());
            //cantidadxPresentacion  = presentacion.getCantidad();

            cantidadPresentaciones = (int) Math.round(productos.get(i).getCantidad());

            prodFinal = dao.getProductoFinal(tipoProducto.getIdtipoproducto(), presentacion.getIdpresentacion());

            float stockActual = prodFinal.getCantidad();
            int stockRequerido = cantidadPresentaciones;


            if (stockActual < stockRequerido) {
                sepuede = false;
            }

        }

        if (!sepuede) {
            Validaciones.mostrarMensajeErrorVal("No hay stock suficiente");
            return;
        }

        for (int i = 0; i < productos.size(); i++) {
            //disminuye stock del producto

            tipoProducto = dao.getTipoProducto(productos.get(i).getTipoproducto().getIdtipoproducto());
            presentacion = dao.getPresentacion(productos.get(i).getPresentacion().getIdpresentacion());
            //cantidadxPresentacion  = presentacion.getCantidad();

            cantidadPresentaciones = (int) Math.round(productos.get(i).getCantidad());

            prodFinal = dao.getProductoFinal(tipoProducto.getIdtipoproducto(), presentacion.getIdpresentacion());

            float stockActual = prodFinal.getCantidad();
            int stockRequerido = cantidadPresentaciones;

            stockfinal = stockActual - stockRequerido;

            if (stockActual > stockRequerido) {

                prodFinal.setCantidad(stockfinal);
                daodao.guardarProductoFinal(prodFinal);
                mensaje = mensaje + tipoProducto.getNombre() + "\n";

            } else {
                Validaciones.mostrarMensajeErrorVal("No hay suficiente stock para la demanda");
                return;
            }

            // el kardex


            Kardex k = new Kardex();
            k.setFecha(new Date());
            k.setHora(new Date());
            k.setEstado(1); // 1 indica que se realizo el movimiento
            k.setTipo("PF"); // 1 indica que se realizo el movimiento
            k.setCantidad((long) stockRequerido);
            k.setEntradasalida('S');
            k.setTipoproducto(tipoProducto);
            k.setPresentacion(presentacion);

            k.setAlmacen(prodFinal.getAlmacen());
            k.setMotivo("Salida por venta a cliente");
            daodao.guardarKardex(k);


        }
        Validaciones.mostrarMensajeAvisoVal(mensaje);
        LogDAO.insertarLog(MainController.usuario, "Entregar Pedido de Producto");
            
        p.setEstado(5); //finalizada y entregada
        dao.guardarPedidoProd(p);
    }
}
